
//
//  WBStatusViewModel.swift
//  SinaWebo
//
//  Created by 亚杏 on 2017/5/23.
//  Copyright © 2017年 oms. All rights reserved.
//

import Foundation

/**
 如果没有任何父类，在调试时希望输出调试信息，需要：
 1. 遵守CustomStringConvertible
 2. 实现description计算型属性
 **/

/**关于表格的性能优化
  - 尽量少计算，所有需要的素材提前准备好
  - 控件上不要随意设置圆角半径，所有图像渲染的属性，都要注意
  - 不要动态创建控件，所有需要的东西都要提前创建好，在显示的时候，根据数据隐藏、显示
  - Cell中控件的层次减少越少越好
 **/

//单条微博的视图模型
class WBStatusViewModel:CustomStringConvertible {

    //微博模型
    var status:WBStatus
    
    //会员图标
    var memberIcon: UIImage?
    //认证图标
    var vipIcon: UIImage?

    //转发文字
    var retweetedStr: String?
    //评论文字
    var commentStr: String?
    //点赞文字
    var likeStr: String?
     
    //配图视图大小
    var picViewSize = CGSize()

    //如果是转发的微博，原创微博一定没有图
    var picURLs: [WBStatusPic]? {
        return status.retweeted_status?.pic_urls ?? status.pic_urls
    }

    //被转发微博属性文字
    var retweetedAttrText: NSAttributedString?

    //正文的属性文本
    var statusAttrText: NSAttributedString?

    //计算行高
    var rowHeight: CGFloat = 0

    //构造函数
    init(model:WBStatus) {
        self.status = model
        //直接计算会员图标
        if (model.user?.mbrank)! > 0 && (model.user?.mbrank)! < 7 {
            let imageName = "common_icon_membership_level\(model.user?.mbrank ?? 1)"
            memberIcon = UIImage(named: imageName)
        }

        //认证图标 
        switch model.user?.verified_type ?? -1 {
        case 0:
            vipIcon = UIImage(named: "avatar_vip")
        case 2,3,5:
            vipIcon = UIImage(named: "avatar_enterprise_vip")
        case 220:
            vipIcon = UIImage(named: "avatar_grassroot")
        default:
            break
        }

        //设置底部计数字符串
        retweetedStr = countString(count: model.reposts_count, defaultStr: "转发")
        commentStr = countString(count: model.comments_count, defaultStr: "评论")
        likeStr = countString(count: model.attitudes_count, defaultStr: "点赞")

        //计算配图视图大小(有原创就计算原创的，有转发的就计算转发的)
        picViewSize = calcPicViewSize(count: picURLs?.count)

        //--------设置微博文本
        let originalFont = UIFont.systemFont(ofSize: 15)
        let retweetedFont = UIFont.systemFont(ofSize: 14)

        let retText = "@" + (status.retweeted_status?.user?.screen_name ?? "") + ":" + (status.retweeted_status?.text ?? "")

        //设置转发微博属性文本
        retweetedAttrText = XYXEmoticonManager.shared.emoticonStringToAttrStr(string: retText, font: retweetedFont)

        //设置正文属性文本
        statusAttrText = XYXEmoticonManager.shared.emoticonStringToAttrStr(string: model.text ?? "", font: originalFont)

        //计算行高
        updateRowHeight()

    }

    //根据当前视图模型内容计算行高
    func updateRowHeight() {
        //原创微博： 顶部分隔视图（12）+ 间距（12）+ 图像高度（34）+ 间距（12）+ 正文高度（计算） + 配图视图高度（计算）+ 间距（12）+ 底部视图高度（35）

        //被转发微博：顶部分隔视图（12）+ 间距（12）+ 图像高度（34）+ 间距（12）+ 正文高度（计算）+ 间距（12）+ 间距（12）+ 转发文本高度（计算）+ 配图视图高度（计算）+ 间距（12）+ 底部视图高度（35）

        let margin: CGFloat = 12
        let iconHeight: CGFloat = 34
        let toolbarHeight: CGFloat = 35

        var height: CGFloat = 0
        let textSize = CGSize(width: UIScreen.cz_screenWidth() - 2 * margin, height: CGFloat (MAXFLOAT))

        //1. 计算顶部位置
        height = 2 * margin + iconHeight + margin

        // 2.正文高度
        if let text = statusAttrText {
          height += text.boundingRect(with: textSize, options: [.usesLineFragmentOrigin], context: nil).height
        }

        //3. 判断是否转发微博
        if status.retweeted_status != nil {
            height += 2 * margin
            //转发文本高度
            if let text = retweetedAttrText {
              height += text.boundingRect(with: textSize, options: [.usesLineFragmentOrigin], context: nil).height
            }
        }

        //4. 配图视图
        height += picViewSize.height
        height += margin

        //5.底部工具栏
        height += toolbarHeight

        //使用属性记录
        rowHeight = height

    }

    //指定数量的图片，计算配图视图大小
    private func calcPicViewSize(count: Int?) -> CGSize {

        if count == 0 || count == nil {
            return CGSize()
        }

        //计算高度
        //1> 根据count计算行数,1 ~ 9
        let row = (count! - 1) / 3 + 1
        let height = WBStatusPicViewOutterMargin + CGFloat(row) * WBStatusPicItemWidth + (CGFloat(row) - 1) * WBStatusPicViewInnerMargin


        return CGSize(width: WBStatusPicViewWidth, height: height)
    }


    /// 使用单个图像更新配图视图大小
    /// 新浪针对单张图片都是缩略图，但偶尔会有一张特别大的图 7000*9000多
    /// 为鼓励原创，支持’长微博’,但有时候，特别长的微博，长到宽度只有1点
    /// - Parameter image: 网络缓存的单张图像
    func updateSinglePicViewSize(image: UIImage) {

        var size = image.size

        //过宽图像处理
        let maxWidth: CGFloat = WBStatusPicViewWidth
        let minWidth: CGFloat = 40

        if size.width > maxWidth {
            size.width = 200
            //等比例调整高度
            size.height = size.width * image.size.height / image.size.width
        }

        //过窄图像处理
        if size.width < minWidth {
            size.width = minWidth
            //等比例调整高度
            size.height = size.width * image.size.height / image.size.width/4
        }

        //过高图片处理,图片填充模式就是 scaleToFill，高度减小会自动裁切
        if size.height > 200 {
            size.height = 200
        }

        //特例：有些图像本身就很窄，很长 -> 定义一个minHeight，思路同上！

        //尺寸需要增加顶部12点，便于布局
        size.height += WBStatusPicViewOutterMargin
        picViewSize = size

        //更新行高
        updateRowHeight()

    }

    var description: String{
        return status.description
    }

    //给定一个数字 ，返回一个描述结果
    /**
     如果数量 == 0， 显示默认标题
     如果数量 >10000, 显示x.xx万
     如果数量 <10000, 显示实际数字
     */

    private func countString(count: Int, defaultStr: String) -> String{

        if count == 0 {
            return defaultStr
        }

        if count < 10000 {
            return count.description
        }

        return String(format: "%.02f 万", Double(count)/10000)

    }




}
